##### THIS CODE PRODUCES PLOTS FOR PREDICTED V. ACTUAL DELEGATION AND CONSTRAINT RATIOS FROM
##### THE CODED EU PROVISIONS

library(foreign)
library(ggplot2)

franchino.data = 
  read.csv("~/Dropbox/Research/Papers/Delegation-ML-Project/Data/APSR_RnR/PlusMissing-FinalAmendments_Modified_Constraint_COM.csv")

newamend = revalue(franchino.data[,1], c("358R0003"="358R003", "358R0004"="358R004")) # Patch

franchino.data[,1]<-newamend #Patch


franchio.orig = 
  read.csv("~/Dropbox/Research/Papers/Delegation-ML-Project/Data/franchino-link.csv")

franchino.year = 
  read.csv("~/Dropbox/Research/Papers/Delegation-ML-Project/Data/FranchinoYear.csv") # Note this is used to link year to law ID

global.id = franchino.year$ID
global.year = franchino.year$Year
franchino.amendment = franchino.data$AMENDMENT

franchino.data.id = data.frame(franchino.amendment)
franchino.year.id = data.frame(global.id,global.year)

# Now let's create a new variable in which we merge the year into the training data
training.merge = merge(franchino.data.id,franchino.year.id,by.x="franchino.amendment",by.y = "global.id")

final.year = training.merge$global.year
final.id = training.merge$franchino.amendment

# We can use the trained classifiers to make predictions on the text:

library(pacman)


# This loads and installs the packages you need at once
pacman::p_load(tm,SnowballC,foreign,plyr,twitteR,slam,foreign,wordcloud,LiblineaR,e1071, topicmodels,readr,
               caret,dplyr,xgboost,quanteda)

############################################################################################################
############################################################################################################
############################################################################################################
############################################################################################################
##################################    Comparisons of Predicted/Acual #######################################
############################################################################################################
############################################################################################################
############################################################################################################
############################################################################################################
############################################################################################################
############################################################################################################
############################################################################################################


## Process the text data
# Preprocess the text 

# Now we have to put the training data and classification data into one matrix

provisiontext.predict<-sapply(franchino.data$Text,as.character)

cleancorpus.predict<-corpus(provisiontext.predict)

token.dirty  = tokens(provisiontext,ngrams = 1:2)
token.clean = tokens_select(token.dirty, 
                            c("/","@", "\\|","#","http","https" ,".com","$", " g "),
                            selection ="remove")

dtm.predict <- dfm(token.clean, remove = stopwords("english"), 
                   remove_punct = TRUE,stem = TRUE)

dtm.predict <- dfm_trim(dtm.predict,sparsity=.99)

dtm_all_mat<-as.matrix(dtm.predict)

##########################################################################################################################
##########################################################################################################################
##########################################################################################################################
################################Constraint Classifiers ######################################################################
##########################################################################################################################
##########################################################################################################################
##########################################################################################################################
##########################################################################################################################

predvals = data.frame(franchino.data$AMENDMENT)


classifier.list = list.files("~/Dropbox/Research/Papers/Delegation-ML-Project/Trained-Classifiers/APSR_RnR/COM-Classifiers/")

trained.classifiers = list.files("~/Dropbox/Research/Papers/Delegation-ML-Project/Trained-Classifiers/APSR_RnR/COM-Classifiers/10percent/")
#trained.classifiers = trained.classifiers[3:11]


for(i in 1:length(trained.classifiers)){
  trained.classifiers[i] = paste("~/Dropbox/Research/Papers/Delegation-ML-Project/Trained-Classifiers/APSR_RnR/COM-Classifiers/10percent/",
                                 trained.classifiers[i],sep = "")
}

colnames.classifiers = c()

# Generate predictions for each of the constraint classifiers, save the predictions in a big ass file
for(i in 1:8){
  load(trained.classifiers[i])
  print(trained.classifiers[i])
  
  # First step is to match the columns to subset
  colnames<-colnames(trainX)
  fullnames<-dtm.predict$dimnames$Terms
  indexno<-c()
  
  for(j in 1:length(colnames)){
    tempname = colnames[j]
    indexnum = which(tempname == fullnames)
    indexno = c(indexno, indexnum)
  }
  
  
  dtm_mat_class<-dtm_all_mat[,indexno]
  
  # Make predictions
  constraint.probs <- as.vector(predict(xgb1,dtm_mat_class))
  constraint.predictions <- ifelse(constraint.probs > 0.5,1,0)
  
  predvals = data.frame(predvals, constraint.probs,constraint.predictions)
  colnames.classifiers = c(colnames.classifiers,
                           paste(constrainttype,".probs", sep = ""), 
                           paste(constrainttype,".preds", sep =""))
}

names(predvals)[2:dim(predvals)[2]]<-colnames.classifiers

##########################################################################################################################
##########################################################################################################################
##########################################################################################################################
################################ Delegation Classifier  ##################################################################
##########################################################################################################################
##########################################################################################################################
##########################################################################################################################
##########################################################################################################################

load(trained.classifiers[9])

# First step is to match the columns to subset
colnames<-colnames(trainX)
fullnames<-dtm.predict$dimnames$Terms
indexno<-c()

for(j in 1:length(colnames)){
  tempname = colnames[j]
  indexnum = which(tempname == fullnames)
  indexno = c(indexno, indexnum)
}


dtm_mat_class<-dtm_all_mat[,indexno]

# Make predictions
delegation.probs <- as.vector(predict(xgb1,dtm_mat_class))
delegation.predictions <- ifelse(delegation.probs > 0.5,1,0)


predvals = data.frame(predvals, delegation.probs,delegation.predictions)

# ADD in the hand coded delegation 
delegation.hand = franchino.data$Lable

predvals = data.frame(predvals,delegation.hand)


write.csv(predvals,
          "~/Dropbox/Research/Papers/Delegation-ML-Project/FINAL-OUTPUT-DATA/APSR_RnR/COMpredicted-hand-delegation-constraint.csv")


######################
# Need to merge the year here

predvals.year =merge(predvals,franchino.year.id,
                     by.x = "franchino.data.AMENDMENT", 
                     by.y = "global.id")



predicted.delegation = aggregate(predvals.year, 
                                 by=list(predvals.year$franchino.data.AMENDMENT,
                                         predvals.year$global.year),
                                 FUN = mean)


predicted.delegation = aggregate(predicted.delegation, by=list(predicted.delegation$Group.2),FUN=mean)

# Plot the predicted v. actual
df = data.frame(
    Ratio = c(predicted.delegation$delegation.predictions,predicted.delegation$delegation.hand),
    Type = c(rep("GBT Predicted", length(predicted.delegation$delegation.predictions)),
              rep("Hand Coded", length(predicted.delegation$delegation.hand))),
    Year = c(predicted.delegation$Group.2,predicted.delegation$Group.2)
)

### Plot predicted v. actual delegation
setwd("~/Dropbox/Research/Papers/Delegation-ML-Project/Draft-EU-Paper/figs/APSR_RnR")

ggplot(data=df, aes(x=Year, y=Ratio, group=Type)) +
  geom_line(aes(linetype=Type))+
  geom_point(aes(shape=Type)) + theme_classic() +
  ylab("Delegation Ratio")  + 
  theme(axis.text=element_text(size=13))

ggsave("COMdelegation-predicted-actual_FINAL-50percent.png")

#### Now for the constraint ratio
constraint.index = c(1,9:20)
constraint.preds.index = seq(from = 3, to = 17,by=2)

constraint.preds = predvals[,constraint.preds.index]

f.constraint = franchino.data[,constraint.index]

f.constraint[,2] = ifelse(f.constraint[,2] == 1 |f.constraint[,2] == 2 | f.constraint[,2] == 3,1,0 )

constraint.data = data.frame(f.constraint, constraint.preds)

# Now merge in the year

constraint.year =merge(constraint.data,franchino.year.id,
                     by.x = "AMENDMENT", 
                     by.y = "global.id")

# Now sum the whole matrix by id and year


actual.constraint = aggregate(constraint.year[,2:21], 
                                 by=list(constraint.year$AMENDMENT,
                                       constraint.year$global.year),
                                 FUN = sum)

## Now we have to convert everything to binary
for(i in 3:dim(actual.constraint)[2]){
  actual.constraint[,i]<-ifelse(actual.constraint[,i]>=1,1,0)
}

### Now if we do colsums we'll get the constraints
actual.n.constraints = rowSums(actual.constraint[,3:14])
predicted.n.constraints = rowSums(actual.constraint[,15:22])

actual.constraint.ratio = actual.n.constraints/12
predicted.constraint.ratio = predicted.n.constraints/12

# Fold it back into the actual.constraint dataset

final.id = actual.constraint$Group.1
final.year = actual.constraint$Group.2

final.constraint.data = data.frame(final.id,final.year,actual.constraint.ratio,predicted.constraint.ratio)

################################################################################################################################################################
################################################################################################################################################################
################################################################################################################################################################
################################################################################################################################################################
# What I would like to do here is to get the predicted constraint ratio, predicted delegation ratio, Franchino index and discretion index before the data are aggre
#gated by year###########################################################################################################################################
################################################################################################################################################################


discretion.MS = predicted.delegation$delegation.predictions - (final.constraint.data$predicted.constraint.ratio*predicted.delegation$delegation.predictions)

delegation.constraint.discretion.Franchino = data.frame(
  final.constraint.data$final.id,
  final.constraint.data$final.year,
  predicted.delegation$delegation.predictions,
  final.constraint.data$predicted.constraint.ratio,
  discretion.MS
)

write.csv(delegation.constraint.discretion.Franchino,
          "~/Dropbox/Research/Papers/Delegation-ML-Project/FINAL-OUTPUT-DATA/APSR_RnR/Final-Ratios/discretion-delegation-constraint_COM_Franchino.csv")


################################################################################################################################################################
################################################################################################################################################################
################################################################################################################################################################
################################################################################################################################################################


final.constraint.data = aggregate(final.constraint.data,
                                  by = list(final.constraint.data$final.year),
                                  FUN = mean)


# Plot the predicted v. actual
df2 = data.frame(
  Ratio = c(final.constraint.data$predicted.constraint.ratio,final.constraint.data$actual.constraint.ratio),
  Type = c(rep("GBT Predicted", length(final.constraint.data$final.id)),
           rep("Hand Coded", length(final.constraint.data$final.id))),
  Year = c(final.constraint.data$final.year,final.constraint.data$final.year)
)


### Plot predicted v. actual constraint
setwd("~/Dropbox/Research/Papers/Delegation-ML-Project/Draft-EU-Paper/figs/APSR_RnR")

ggplot(data=df2, aes(x=Year, y=Ratio, group=Type)) +
  geom_line(aes(linetype=Type))+
  geom_point(aes(shape=Type)) + theme_classic() + ylab("Constraint Ratio")  + 
  theme(axis.text=element_text(size=13))

ggsave("COMconstraint-predicted-actual_FINAL-50percent.png")

### Combine the datasets



predicted.delegation.constraint = data.frame(final.constraint.data$Group.1,
                                             final.constraint.data$final.year,
                                            final.constraint.data$predicted.constraint.ratio,
                                            final.constraint.data$actual.constraint.ratio,
                                             predicted.delegation$delegation.predictions,
                                             predicted.delegation$delegation.hand)

names(predicted.delegation.constraint)<-c("ID","Year", "Predicted.Constraint","Hand.Constraint", "Predicted.Delegation","Hand.Delegation")

write.csv(predicted.delegation.constraint,
          "~/Dropbox/Research/Papers/Delegation-ML-Project/FINAL-OUTPUT-DATA/APSR_RnR/COMpredicted-hand-delegation-constraint.csv")

# Might as well do discretion index





















